/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package FileOverNet;

import Echo.*;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class FileClient implements Runnable {

    @Override
    public void run() {


        //пытаемся достучаться к серверу
        while (true) {

            Socket kkSocket = null;



            try {

                kkSocket = new Socket("mez-noskov", 4444);

            } catch (UnknownHostException e) {
                System.err.println("Don't know about host: mez-noskov.");
                //System.exit(1);
            } catch (IOException ex) {
            } finally {

                //Если сокет получит не удалось, засыпаем на 10 секунд и пробуем снова
                if (kkSocket == null) {
                    System.out.println("Не удалось получит сокет. Засыпаю..");
                    try {
                        Thread.sleep(10 * 1000);
                        continue;
                    } catch (InterruptedException ex) {
                        System.exit(1);
                    }

                }

            }


            InputStream serverInputStream = null;
            try {
                serverInputStream = kkSocket.getInputStream();
            } catch (IOException e) {
                System.err.println("Не удалось получить входной поток. Попытка восстановить соединение");
            }

            //читалка команд
            BufferedReader serverInReader = null;
            serverInReader = new BufferedReader(new InputStreamReader(serverInputStream));

            
            System.out.println("Связь с сервером установлена");
            
            

            while (true) {

                String serverCommand = "";
                
                OutputStream serverOutputStream = null;
                
                
                //читаем
                try {
                    serverCommand = serverInReader.readLine();
                } catch (IOException e) {
                    System.out.println("Команду получить не удалось, связь с сервером оборвана. Попытка восстановить соединение");
                }

                switch (serverCommand) {
                    case "getFile":
                            
                        System.out.println("Получена команда на копирование файла");
                        
                        //talk to server
                        String fileName = "";
                        try {
                            fileName = serverInReader.readLine();
                        } catch (IOException e) {
                            System.out.println("Имя файла получить не удалось, связь с сервером оборвана. Попытка восстановить соединение");
                        }

                        FileInputStream inFile = null;
                        byte[] buffer = new byte[1024 * 1024];

                        try {
                            serverOutputStream = kkSocket.getOutputStream();
                        } catch (IOException ex) {
                            //не удалось получить выходной поток, нужно переподключаться
                            System.out.println("Не удалось получить выходной поток. Попытка восстановить связь.");
                            break;
                        }

                        try {
                            inFile = new FileInputStream(fileName + ".mp3");
                            System.out.println("Файл открыт для чтения");
                        } catch (IOException ex) {
                            System.out.println("File " + fileName + ".mp3 not found");
                            continue;
                        }

                        try {
                            System.out.println("Начинаем копирование");
                            for (int size; (size = inFile.read(buffer)) != -1;) {
                                serverOutputStream.write(buffer, 0, size);
                            }
                            System.out.println("Копирование завершено");
                        } catch (IOException ex) {
                            System.out.println("Копирование не удалось");
                            continue;
                        } finally {
                            
                            closeStream(inFile);
                            try {
                                serverOutputStream.flush();
                            } catch (IOException ex) {
                            }

                        }

                        break;
                    case "stop":
                    case "exit":
                    case "quit":


                        closeStream(serverInReader);
                        closeStream(serverInputStream);
                        closeStream(serverOutputStream);
                        
                        //closeStream(kkSocket);

                        

                        
                        
                        System.exit(1);
                        break;
                }

            }

        }


    }
    
    public void closeStream(Closeable stream) {
        if (stream != null) {
            try {
                stream.close();
            } catch (Exception e) {
            }
        }
    }

    public static void main(String[] args) throws IOException {

        new Thread(new FileClient()).start();

    }
}
//               PrintWriter outPrint = new PrintWriter(out, true);
//                outPrint.println("copy_file");
//                outPrint.println(fileName);
                    //                outPrint.close();
